ASP.NET Core 其實本身已經內建了一套 Log 工具,透過 DI 的方式注入,就可以直接取得並使用 Log 的物件實體,而且也可以外掛第三方的 Log 架構
方便的是 ASP.NET Core 預設就已經將 Logger 物件放入 DI 容器中了,所以不需要再額外進行設定,只要直接透過 DI 的方式取得 Logger 物件實體
Logger 物件提供了不同層級的 Log,共分為六種,定義在 LogLevel 列舉中
如以下範例程式碼,直接宣告 Logger 物件,並透過 DI 容器注入,注意要引用 using Microsoft.Extensions.Logging;
命名空間,且 Logger 物件為泛型,所以要指定 Class 名稱,以此為例就是: ILogger<HomeController>
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
namespace Day01_03___ASP.NET_Core_Logging.Controllers
{
public class HomeController : Controller
{
private ILogger logger;
public HomeController (ILogger<HomeController> log)
{
logger = log;
}
public IActionResult Index ()
{
logger.LogDebug (LoggingEvents.CreateAction, "Log Debug");
logger.LogInformation (LoggingEvents.EditAction, "Log Information");
logger.LogWarning (LoggingEvents.GetAction, "Log Warning");
logger.LogError (LoggingEvents.DeleteAction, "Log Error");
logger.LogCritical ("Log Critical");
return Content ("");
}
}
public class LoggingEvents
{
public const int CreateAction = 1000;
public const int EditAction = 1001;
public const int GetAction = 1002;
public const int DeleteAction = 1003;
}
}
寫完程式碼後,就可以執行來看看,先在 terminal
中輸入 dotnet run
指令來進行編譯並把應用程式跑起來,跑起來後就可以直接呼叫網頁,最後在 terminal
中就可以看到 Log 的輸出結果
在上圖的第二步驟紅框中,就可以看到 Log 輸出的結果,針對不同層級也會有不同的顯示樣式
而在第二步驟的綠框中則是事件代碼,通常在系統中都會定義事件代碼
例如說:資料庫無法連線的錯誤代碼設定為 001
因此在寫入 Log 時也可以傳入事件代碼以供事後快速辨別
還有一小部分要提到的是預設格式化訊息的方式,假設有 Log 事件如下
string str1 = "name1";
string str2 = "name2";
logger.LogDebug ("{str2} not match with: {str1}", name1, name2);
因其格式化的方式是依照參數的先後順序,而非於字串中的變數名稱而定
所以其輸出結果會為:name1 not match with: name2
也可以將例外傳入到 Log 裡
var ex = new NotImplementedException("Take easy.");
logger.LogCritical (ex, "Log Critical");
下一篇來介紹ASP.NET Core 內建之 Logger的組態設定、如何設定要記錄的 Log 層級以及如何輸出 Log 到不同的地方,而不是只是寫到 Console